BITS 16
ORG 0x1200
kernel_start:

	cli
	call	check_A20
	call	enable_A20
	call	check_A20
	jmp		sigue
mensajereal: db "Este es un mensaje en modo real"
mensajereal_len equ $ - mensajereal
	sigue:

	; Imprimo un mensaje en modo real
	xor		ax, ax
	mov		ds, ax
	mov		ax, 0xB800
	mov		es, ax

	mov		si, mensajereal
	mov		cx, mensajereal_len
	mov		di, (80 * 6) << 1 	; Fila 6, columna 1
	mov		ah, 00001100b		; Fondo negro, caracter rojo brillante
	
	.cicloreal:
		lodsb
		stosw
		loop	.cicloreal
	
	;xchg	bx, bx
	
	lgdt	[gdtr]
	
	mov		eax, cr0
	or		eax, 1
	mov		cr0, eax
	
	jmp		0x08:modo_protegido

BITS 32
modo_protegido:	
	mov		ax, 0x10
	mov		ds, ax
	mov		es, ax
	mov		fs, ax
	mov 	gs, ax
	
	mov		edi, 0xB8000
	mov		esi, mensajeprotegido
	add		edi, (80 * 7) << 1			; Fila 7 columna 1
	mov		ecx, mensajeprotegido_len
	mov		ah, 00001001b				; Fondo negro, caracter azul brillante
	
	.cicloprotegido:
		lodsb
		stosw
		loop	.cicloprotegido
	
	jmp $
	
mensajeprotegido: db "A la grande le puse cuca. Lisa necesita frenos. Plan dental"
mensajeprotegido_len equ $-mensajeprotegido

gdt:
	dd 	0x00000000			; 1er descriptor nulo
	dd 	0x00000000

	dw	0xFFFF				; Limite = 0xFFFF
	dw	0x0000				; Base = 0x0000
	db  0x00				; Base = 0x00
	db 	10011010b			; presente, DPL=0, no sistema, tipo = codigo, ejecutable y lectura
	db	11001111b			; G=1, D/B=1, Avl=0, Limite = 0xF
	db	0x00				; Base = 0x00;
	
	dw	0xFFFF				; Limite = 0xFFFF
	dw	0x0000				; Base = 0x0000
	db  0x00				; Base = 0x00
	db 	10010010b			; presente, DPL=0, no sistema, tipo = datos, lectura y escritura
	db	11001111b			; G=1, D/B=1, Avl=0, Limite = 0xF
	db	0x00				; Base = 0x00;

gdt_end:

gdtr:
	dw	gdt_end - gdt - 1
	dd	gdt
	
%include "a20.asm"
